import time
import os
import sys
from welt import *
sys.path.append("temp/database")
db = ""
try:
    import mysql
    db = "mysql"
except:
    import sqlite
    db = "sqlite"
import getpass

pstart = 'Keller'
_notizblock = ""
befehle = ['schaue', 'gehe', 'nimm', 'verwende', 'untersuche', 'frage', 'werkzeuge', 'hilfe', 'lies', 'notizblock', 'menu', 'beenden','MATRIX']
orte = {}
rucksack = {}
user = ""

def schaue(first=False):
    """
    schaue: zeigt die naehere Umgebung an
    """
    
    global loc
    global user
    
    #try:
    if first: print "Hallo " + user + "!"
    print "Du siehst:\n"+loc.beschreibung()
    #print "Hallo "+user+". Du siehst:\n"+loc.beschreibung()
    #except:
    #    raise Error, '    Nichts da zum Beschreiben\n'+schaue.__doc__
    
def gehe(wohin):
    """
    gehe [wohin]: ermoeglicht einen Wechsel an einen anderen Ort. 
    """
    global loc
    global orte
    global _notizblock
    
    try:
        if not loc._name in orte: orte[loc._name] = loc._name
        ziel = loc.gehe(wohin)
        if ziel in orte or ziel == loc._name:
            loc = ort(orte[ziel])
            loc.lade('')
        else:
            _notizblock = _notizblock + "[" + loc._name + "]: " + loc.notiz()
            loc = ort(ziel)
            loc.lade( os.getcwd() )
            if not loc._name in orte: orte[loc._name] = loc._name
        print loc.beschreibung()
    except Error, e:
        raise Error, e

def nimm(was):
    """
    nimm [was]: kann Dinge nehmen und im Rucksack verstauen.
    Die Dinge fehlen danach in der Welt.
    """
    global loc
    global rucksack
    b = 0
    for n in loc._werkzeuge:
        if n._name == was:
            rucksack[was] = n
            loc._werkzeuge.remove(n)
            print was + ' ist nun im Rucksack.'
            b = 1
    if b==0: raise Error, '    Kann '+was+' nicht nehmen.\n'+nimm.__doc__

def lies(was):
    """
    lies [was]: kann Briefe, Nachrichten, Aufschriften lesen.
    """
    global loc
    
    b = 0
    for n in loc._botschaften:
        if n._name == was:
            print n.content()
            b = 1
    if b==0: raise Error, '    Kann '+was+' nicht lesen.\n'+lies.__doc__
    
def untersuche(was):
    """
    untersuche[was]: Untersucht eine Leiche.
    """
    lies(was)
    
def verwende(was, *womit):
    
    """
    verwende [was, womit]: kann die Zustaende von Maschinen veraendern.
    """
    
    global rucksack
    global loc
    
    if was in rucksack:
#        if len(womit) > 1: womit = womit[1] # bei partizipien etc.
        b = 0
        for m in loc._maschinen:
            if m._name in womit:
                print m.verwende(was)
                if rucksack[was].verwendet() == 0:
                    del rucksack[was]
                b = 1
        if b == 0:
            raise Error, 'Kann '+was+' nicht '+''.join(womit)+' verwenden.\n'+verwende.__doc__
    else:
        raise Error, was + ' habe ich nicht im Rucksack.'

def notizblock():
    """
    notizblock: Zeigt deinen Notizblock
    """
    global _notizblock
    print _notizblock

def frage(wen):
    """
    frage [wen]: Frage eine Person.
    """
    global loc
    b = 0
    for n in loc._personen:
        if n._name == wen:
            n.frage()
            b = 1
    if b == 0: raise Error, 'Kann '+wen+' nicht fragen.\n'+frage.__doc__
        
def hilfe():
    """
    hilfe: Zeigt die Liste der Befehle und ihre Verwendung an.
    """
    global befehle
    
    for n in befehle:
        print eval(n).__doc__

def werkzeuge():
    """
    werkzeuge: Zeigt den Inhalt des Rucksacks an.
    """
    global rucksack
    
    if rucksack != {}:
        print 'Im Rucksack sind momentan '
        for n in rucksack: print 1, rucksack[n]._name, rucksack[n]._verwendbarkeit
    else: print 'Der Rucksack ist leer.'

def beenden():
    """
    beenden: Beendet das Programm und speichert den Fortschritt.
    """
    mysql.Close()
    print "Danke fuers Spielen!"
    time.sleep(2)
    print "Bye"
    quit()
    
def parse(cmd, *args):
    global befehle
    
    if cmd in befehle:
        try:
            eval(cmd)(*args)
        except Error,e:
            e.report()
    else:
#        print cmd, args
        print 'Das kann ich nicht tun.\n'+cmd+' ist kein gueltiger Befehl.'
        #hilfe()

def new():
    global user
    usr = raw_input("Username:")
    print "##Einfach tippen##"
    pw = getpass.getpass("Passwort:")
    pw2 = getpass.getpass("Passwort wiederholen:")
    email = raw_input("Email:")
    if pw != pw2:
        print "Die Passwoerter stimmen nicht berein."
        return new()
    acc = mysql.CreateAccount(usr,pw,email)
    print acc[0]
    if acc[1] == False:
        return new()
    else:
        user = usr
        
def login(first=False):
    global user
    usr = raw_input("Username:")
    pw = getpass.getpass("Passwort:")
    acc = mysql.Login(usr,pw)
    print acc[0]
    if acc[1] == False:
        print "Da lief wohl was falsch..."
        time.sleep(2)
        menu(first)
    else:
        user = usr
        time.sleep(1)
        os.system("cls")
        #loadgame(first)
        if first: schaue(first)

def start():
    os.system("cls")
    data = zipfile.ZipFile("data.pak","r")
    data.extract("includes/header.inc","temp")
    header = open("temp/includes/header.inc").read()
    for line in header:
        sys.stdout.write(line)
        time.sleep(0.001)
    os.remove("temp/includes/header.inc")
    #time.sleep(3)
    menu(False)

def savegame():
    global user,rucksack,orte,loc
    rp = ""
    op = ""
    for n in rucksack:
        rp = rp + n + ";"
    for n in orte:
        op = op + n + ";"
    print rp,op
    mysql.Update("UPDATE user SET rucksack='"+rp+"' WHERE user='"+user+"';")
    mysql.Update("UPDATE user SET savedata='"+op+"' WHERE user='"+user+"';")
    mysql.Update("UPDATE user SET pstart='"+loc._name+"' WHERE user='"+user+"';")
    """
    print user,rucksack,orte
    tmp = open("temp/temp.pkl", 'wb')
    pickle.dump(rucksack, tmp) 
    rp = tmp.read()
    tmp.truncate()
    pickle.dump(orte, tmp)
    op = tmp.read()
    tmp.truncate()
    print "Speichere Spielstand..."
    print user,rucksack,orte
    rp = str.encode(rp,'base64')
    op = str.encode(op,'base64')
    print rp,op
    mysql.Update("UPDATE user SET rucksack='"+rp+"' WHERE user='"+user+"';")
    mysql.Update("UPDATE user SET savedata='"+op+"' WHERE user='"+user+"';")
    mysql.Update("UPDATE user SET saved=1 WHERE user='"+user+"';")
    """
    print "Spielstand erfolgreich gespeichert!"

def loadgame(first=False):
    global user,rucksack,orte,pstart,loc
    rp = mysql.Select("SELECT rucksack FROM user WHERE user='"+user+"';")
    rp = rp[0][0]
    op = mysql.Select("SELECT savedata FROM user WHERE user='"+user+"';")
    op = op[0][0]
    for n in rp.split(";"):
        if n != "":
            wk = werkzeug(n)
            rucksack[n] = wk
            wk.lade('')
    for n in op.split(";"):
        orte[n] = n
    print "Spielstand laden..."
    """
    tmp = open("temp/temp.pkl", 'wb')
    rp = mysql.Select("SELECT rucksack FROM user WHERE user='"+user+"';")
    rp = rp[0][0]
    rp = str.decode(rp,'base64')
    tmp.write(rp)
    rucksack = pickle.load(tmp)
    tmp.truncate()
    op = mysql.Select("SELECT savedata FROM user WHERE user='"+user+"';")
    op = op[0][0]
    op = str.decode(op,'base64')
    tmp.write(op)
    orte = pickle.load(tmp)
    tmp.truncate()
    """
    print "Spielstand erfolgreich geladen!"
    for n in orte.keys():
        if n != "":
            print n
            loc = ort(n)
            loc.lade('')
            print loc
    pstart = mysql.Select("SELECT pstart FROM user WHERE user='"+user+"';")
    pstart = pstart[0][0]
    loc = ort(pstart)
    loc.lade('')
    schaue(first)
    

def menu(save=True):
    """
    menu: Zeigt dir das Menu an.
    """
    global user
    print "Was willst du tun?\n\n"
    if not save or user == "": print "1 - Neuen Account anlegen\n"
    print "2 - Mit einem betsehendem Account einloggen\n"
    if not save: print "3 - Anonym spielen (deine Spieldaten koennen so nicht gespeichert werden!)\n"
    if save and user != "": print "4 - Spielstand speichern\n"
    if save and user != "": print "5 - Spielstand laden\n"
    if save: print "C - Abbrechen\n"
    print "X - Das Programm beenden\n"
    inpt = raw_input("# > ")
    if inpt == "1":
        new()
    elif inpt == "2":
        print "Gib bitte deine Logindaten ein!"
        login(save)
    elif inpt == "3":
        print "Viel Spass beim Spielen!"
        os.system("cls")
        user = ""
    elif inpt == "4":
        savegame()
    elif inpt == "5":
        loadgame()
    elif inpt == "c" or inpt == "C":
        return
    elif inpt == "X" or inpt == "x":
        print "Bye"
        time.sleep(1)
        quit()
    else:
        print "'" + inpt + "' steht nicht zur Auswahl"
        return menu(save)

def MATRIX():
    """
    MATRIX: ??????????????
    """
    while 1:
        matrix()
        time.sleep(0.027)
def matrix():
    import sys,random,time
    line = ''
    for x in range(0,79):
        line = line + (str(random.randint(0,1)))
    if random.randint(0,1000) == 10:
        print "CRITICAL ERROR! SYSTEM IS RUNNING OUT OF MEMORY!"
        print "SYSTEM IS NOW SHUTTING DOWN"
        time.sleep(20)
        print "NOT"
        time.sleep(2)
    print line
    
def run():
    global user,orte,rucksack,loc,_notizblock,befehle,pstart,inpt
    start()
    #time.sleep(1)
    os.system("cls")
    u = suser()
    u.setuser(user)
    loc = ort(pstart)
    loc.lade('')
    #print "Hallo " + user + "!"
    schaue(True)
    while 1:
        inpt = raw_input('## > ')
        parse(*inpt.split(' '))
def run2():
    try: run()
    except TypeError, e:
        args = '\', \''.join(inpt.split(' '))
        print "Du hast zu viele Argumente angegeben ('%s')" % (args)
    except Exception, e:
        print "Es ist ein Fehler aufgetreten."
        print "Du hast \'%s\' eingegeben" % (inpt)
        print "Fehler: %s" % (e)
    finally:
        if user != "" and save:
            time.sleep(2)
            print "Speichere das Spiel und starte neu..."
            savegame()
        print "Restarting..."
        time.sleep(2)
        print "Druecke eine Taste"
        if raw_input() == "d":
            raw_input("Debugging...")
            quit()
        else:
            run2()

run2()
